package com.edu.bean;


import jdk.nashorn.internal.ir.annotations.Reference;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

/*
* @Component
*           相当是在 xml中 添加了一个 <bean><bean>
           1 默认情况下 beanId 是 类名 首字母 换成小写
           2 @Component(value="beanId") 自定义
           3 任何一个注解，当属性有且仅只有一个 value属性时，这个value= 可以省略
* */
//@Component(value="stu")
@Component("stu")
//@Scope(scopeName="prototype")
public class Student {

    /*
    *   @value  可以对 容器中的对象的属性 进行赋值
    *           1. 放在对象的 属性上面  -> 通过 java暴力反射机制实现
    *           2. 放在 属性的 set方法之上  -> 通过设值注入
    *
    *
    * */
    private int stuId;

    @Value("zhangsan")
    private String stuName;

    private int stuAge;

    @Value("${stuSex}")
    private String stuSex;

    public String getStuSex() {
        return stuSex;
    }

    public void setStuSex(String stuSex) {
        this.stuSex = stuSex;
    }

    @Value("#{book}")
    private Book book;

    public Book getBook() {
        return book;
    }

    public void setBook(Book book) {
        this.book = book;
    }

    public int getStuId() {
        return stuId;
    }

    @Value("1")
    public void setStuId(int stuId) {
        System.out.println("执行了 stuId 属性的 set方法 设置注入");
        this.stuId = stuId;
    }

    public String getStuName() {
        return stuName;
    }

    public void setStuName(String stuName) {
        this.stuName = stuName;
    }

    public int getStuAge() {
        return stuAge;
    }

    public void setStuAge(int stuAge) {
        this.stuAge = stuAge;
    }

    @Override
    public String toString() {
        return "Student{" +
                "stuId=" + stuId +
                ", stuName='" + stuName + '\'' +
                ", stuAge='" + stuAge + '\'' +
                '}';
    }

    public Student() {
        System.out.println("执行了 Student无参数构造方法");
    }


//    public Student(@Value("10") int stuId, @Value("德华") String stuName, @Value("20") int stuAge) {
//        this.stuId = stuId;
//        this.stuName = stuName;
//        this.stuAge = stuAge;
//    }

    @PostConstruct
    public void myInit(){
        System.out.println("执行了 初始化方法");
        this.stuId = 100;
        this.stuName = "淑芬";
        this.stuSex = "女";
        this.stuAge = 20;
    }


    @PreDestroy
    public void myDestroy(){
        System.out.println("执行了 销毁方法 释放资源");
    }
}
